package com.rpinfo.editalog.usuario.jtable;

import com.rpinfo.editalog.usuario.Usuario;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

/**
 *
 * @author camilo
 */
public class UsuarioJTableDaoHibernate implements UsuarioJTableDao {

  private Session session;
  private Transaction transacao;

  public void setSession(Session session) {
    this.session = session;
  }

  @Override
  public void salvar(UsuarioJTable forn) {
    this.transacao = this.session.beginTransaction();
    this.session.saveOrUpdate(forn);
    this.transacao.commit();
    this.session.close();
  }

  @Override
  public void excluir(UsuarioJTable forn) {
    this.transacao = this.session.beginTransaction();
    this.session.delete(forn);
    this.transacao.commit();
    this.session.close();
  }

  @Override
  public UsuarioJTable carregar(int id) {
    return (UsuarioJTable) this.session.get(UsuarioJTable.class, id);
  }

  @Override
  public List<UsuarioJTable> listar() {
    return this.session.createCriteria(UsuarioJTable.class)
            .addOrder(Order.asc(UsuarioJTable.ATTRIBUTE_JTABLE)).list();
  }

  /**
   * Retorna um objeto criteria com o "Restriction" de acordo a necessidade do usuário <br
   * />
   * <br />
   * Os parâmetros <i>strCrit </i>e<i> dateCrit</i> podem ser declarados como <b>null</b>
   * e o parâmetro <i>intCrit </i> pode ser declarado 0, mas ao menos um dos três precisa
   * ter um valor válido especificado.<br />
   * <br />
   * Caso não seja definida uma opção a opção padrão é <i>CONTENDO</i>
   * e o critério usado será o <i>strCrit</i>
   *
   * @param property Nome do atributo mapeado
   * @param opcao Tipo da pesquisa (contendo, igual, maior, etc)
   * @param strCrit Caso não possua defina null
   * @param intCrit Caso não possua defina 0
   * @param dateCrit Caso não possua defina null
   *
   * @return Criteria
   */
//  private Criteria getCriteriaOpcao(String property, Opcao opcao, String strCrit, int intCrit) {
//    Criteria criteria = this.session.createCriteria(UsuarioJTable.class);
//    switch (opcao) {
//      case CONTENDO:
//        criteria.add(Restrictions.ilike(property, strCrit, MatchMode.ANYWHERE));
//        break;
//      case DIFERENTE:
//        if (strCrit == null && intCrit > -1) {
//          criteria.add(Restrictions.ne(property, intCrit));
//        } else {
//          criteria.add(Restrictions.ne(property, strCrit));
//        }
//        break;
//      case IGUAL:
//        if (strCrit == null && intCrit > -1) {
//          criteria.add(Restrictions.eq(property, intCrit));
//        } else {
//          criteria.add(Restrictions.eq(property, strCrit));
//        }
//        break;
//      case INICIA:
//        criteria.add(Restrictions.ilike(property, strCrit, MatchMode.START));
//        break;
//      case MAIOR:
//        criteria.add(Restrictions.ge(property, intCrit));
//        break;
//      case MENOR:
//        criteria.add(Restrictions.le(property, intCrit));
//        break;
//      case TERMINA:
//        criteria.add(Restrictions.ilike(property, strCrit, MatchMode.END));
//        break;
//    }
//    return criteria;
//  }

//  @Override
//  public List<UsuarioJTable> pesquisaPadrao(String property, String criterio, Opcao opcao) {
//    Criteria criteria = getCriteriaOpcao(property, opcao, criterio, 0);
//    criteria.addOrder(Order.asc(property));
//    return criteria.list();
//  }
//
//  @Override
//  public List<UsuarioJTable> pesquisaPadrao(String property, int criterio, Opcao opcao) {
//    Criteria criteria = getCriteriaOpcao(property, opcao, null, criterio);
//    criteria.addOrder(Order.asc(property));
//    return criteria.list();
//  }

  @Override
  public UsuarioJTable carregarJTableUsuario(String jtable, Usuario usuario) {
    Criteria criteria = this.session.createCriteria(UsuarioJTable.class);
    criteria.add(Restrictions.eq(UsuarioJTable.ATTRIBUTE_JTABLE, jtable));
    
    criteria.setFetchMode(UsuarioJTable.ATTRIBUTE_USUARIO, FetchMode.JOIN)
            .add(Restrictions.eq(UsuarioJTable.ATTRIBUTE_USUARIO, usuario));
    
    return (UsuarioJTable) criteria.uniqueResult();
  }
}
